<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // 常用的高阶函数:
        // forEach
        // filter
        // map:js数组函数,不改变原始数组,返回新数组;按照原始数组元素的顺序依次处理元素;不会检测空数组;
        // every:用来判断数组中的[每个元素]是否[都]满足某个条件;按照原始数组元素的顺序依次处理元素;
        // some:用于检测数组中是否有元素满足指定条件[只要有一个元素满足就行];按照原始数组元素的顺序依次处理元素;
        // find/findIndex
        // reduce
        // sort


        // map
        const map = (array,fn) => {//此处map函数的参数fn是一个高阶函数,由于fn是开发者自定义的,所以对于数据的处理具有灵活性
            let results = [];
            for(let value of array) {//遍历数组,将数组中的元素都通过fn处理,并将处理后的元素生成新的数组results
                results.push(fn(value));
            }
            return results;
        }
        let arr = [1,2,3,4];
        arr = map(arr,v => v*v);//将返回的新数组重新赋值给arr
        console.log(arr);//[1,4,9,16]
        
        // every
        const every = (array,fn) => {
            let result = true;//假设数组中所有元素都匹配条件  
            for (let value of array) {//遍历元素判断元素是否匹配条件fn
                result = fn(value);
                if (!result) {//如果有元素不满足条件,说明这个数组中并非每个元素都匹配条件,直接跳出循环
                    break;
                }
            }
            return result;
        }
        let array = [0,1,3,5,6];
        array = every(array, v => v>0 );//判断数组中的元素是否都>0
        console.log(array);//false

        // some
        const some = (array,fn) =>{
            let result = false;
            for(let value of array) {
                result = fn(value);//如果满足条件  true
                if(result) {//如果有一个元素满足条件,直接break.因为some函数就是检测数组中是否有元素会满足条件,只要有一个满足条件就成立
                    break;
                }
            }
            return result;
        }
        let ss = [3,6,8,1];
        ss = some(ss,v => v==1);
        console.log(ss);//true

        // var a = 1;//用var定义的变量，以赋值
        // var b;//用var定义的变量，未赋值
        // c = 3;//未定义，直接赋值
        // function d(){//用声明的方式声明的函数
        //     console.log('hello');
        // }
        // var e = function(){//函数表达式
        //     console.log('world');
        // }
        // console.log(a);//1
        // console.log(b);//undefined
        // console.log(c);//3
        // console.log(d);//f d(){}
        // console.log(e);//f (){}

        // // 函数提升
        // f();//hello  [预解析/预处理/函数提升的函数必须是function声明的函数,=赋值的函数不存在预处理：]
        // g();//g is not a function
        // function f(){//用声明的方式声明的函数
        //     console.log('hello');
        // }
        // var g = function(){//函数表达式
        //     console.log('world');
        // }


    </script>
</body>
</html>